package com.lga.algorithm;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * leetCode 23. 合并K个排序链表
 *
 * @author lga
 */
public class MergeLists {

    /**
     * 定义一个内部的链表节点类
     */
    static class ListNode {
        int val;
        ListNode next;

        ListNode(int x) {
            val = x;
        }

    }

    /**
     * 将已经排好序的k个链表节点进行拼接，并且保留顺序
     * @param lists
     * @return
     */
    public static ListNode mergeKLists(ListNode[] lists) {

        if (lists == null || lists.length == 0) {
            return null;
        }
        //拼接后的链表节点
        ListNode mergeAfterOfListNode = null;
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < lists.length; i++) {
            ListNode listNode = lists[i];
            while (listNode!=null){
                int val1 = listNode.val;
                list.add(val1);
                listNode = listNode.next;
            }
        }

        Collections.sort(list);
        ListNode tempListNode = new ListNode(0);
        mergeAfterOfListNode = tempListNode;

        for (int i = 0; i < list.size(); i++) {
            tempListNode.next = new ListNode(list.get(i));
            tempListNode = tempListNode.next;
        }
        return mergeAfterOfListNode.next;
    }
    public static void main(String[] args){
        ListNode listNode1_0 = new ListNode(1);
        ListNode listNode1_1 = new ListNode(3);
        ListNode listNode1_2 = new ListNode(5);
        ListNode listNode1_3 = new ListNode(7);

        listNode1_0.next = listNode1_1;
        listNode1_1.next = listNode1_2;
        listNode1_2.next = listNode1_3;
        listNode1_3.next = null;

        ListNode listNode2_0 = new ListNode(1);
        ListNode listNode2_1 = new ListNode(2);
        ListNode listNode2_2 = new ListNode(4);
        ListNode listNode2_3 = new ListNode(9);


        listNode2_0.next = listNode2_1;
        listNode2_1.next = listNode2_2;
        listNode2_2.next = listNode2_3;
        listNode2_3.next = null;


        ListNode[] listNodes = new ListNode[]{listNode1_0,listNode2_0};

        mergeKLists(listNodes);
    }
}
